﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using RRHH.Competencias.BusinessLayer.Controladores;
using RRHH.Competencias.BusinessLayer;
using System.Web.Security;

namespace WebSite
{
    public partial class Login : System.Web.UI.Page
    {
        protected int maximoIntentosLogin = 3;

        protected void Page_Load ( object sender, EventArgs e )
        {
            if (!Page.IsPostBack)
            {
                if (Session["AdmnUsuarios.Usuario"] != null) Response.Redirect( "Indice.aspx" );

                //Primera carga, inicializamos el contador
                if (Session["AdmnUsuarios.Login.IntentosLogin"] == null) Session["AdmnUsuarios.Login.IntentosLogin"] = 1;

                DivMensaje.Visible = false;
                DivBloqueoCuenta.Visible = false;                
            }
        }

        protected void LgnLogin_Authenticate ( object sender, AuthenticateEventArgs e )
        {
            int intentosLoginDisponibles = 0;
            GestorLogin gLogin;

            DivMensaje.Visible = false;
            DivBloqueoCuenta.Visible = false;

            if (!Page.IsValid) return;

            try
            {
                intentosLoginDisponibles = Int32.Parse( Session["AdmnUsuarios.Login.IntentosLogin"].ToString() );
                gLogin = new GestorLogin( LgnLogin.UserName, LgnLogin.Password );

                if (intentosLoginDisponibles > maximoIntentosLogin)
                {
                    gLogin.BloquearUsuario();
                    intentosLoginDisponibles = 0;

                    DivBloqueoCuenta.Visible = true;
                    DivMensaje.Visible = true;
                    DivMensaje.InnerText = "El usuario se ha bloqueado al superar la cantidad máxima de intentos de login.";

                    return;
                }

                gLogin.ValidarAcceso();

                this.CrearTicketAcceso();

                Session["AdmnUsuarios.Usuario"] = gLogin.UsuarioLogin;
                Session["AdmnUsuarios.Login.IntentosLogin"] = null;

                e.Authenticated = true;

                Response.Redirect( "Inicio.aspx", false );
            }
            catch (BusinessException be)
            {
                DivMensaje.Visible = true;
                DivMensaje.InnerText = be.Message;

                intentosLoginDisponibles++;
                Session["AdmnUsuarios.Login.IntentosLogin"] = intentosLoginDisponibles;

                e.Authenticated = false;
            }
            catch (Exception ex)
            {
                DivMensaje.Visible = true;
                DivMensaje.InnerText = ex.Message + " Intentos: " + intentosLoginDisponibles.ToString();

                intentosLoginDisponibles++;
                Session["AdmnUsuarios.Login.IntentosLogin"] = intentosLoginDisponibles;

                e.Authenticated = false;
            }
        }

        private void CrearTicketAcceso ()
        {
            // Create the authetication ticket
            FormsAuthenticationTicket authTicket = new FormsAuthenticationTicket( LgnLogin.UserName, false, 60 );

            // Now encrypt the ticket.
            string encryptedTicket = FormsAuthentication.Encrypt( authTicket );

            // Create a cookie and add the encrypted ticket to the cookie as data.
            HttpCookie authCookie = new HttpCookie( FormsAuthentication.FormsCookieName, encryptedTicket );

            // Add the cookie to the outgoing cookies collection.
            Response.Cookies.Add( authCookie );
        }
    }
}